package com.xixi.core.rpc;

import com.xixi.core.rpc.config.RegistryConfig;
import com.xixi.core.rpc.config.RpcConfig;
import com.xixi.core.rpc.constant.RpcConstant;
import com.xixi.core.rpc.registry.Registry;
import com.xixi.core.rpc.registry.RegistryFactory;
import com.xixi.core.rpc.utils.ConfigUtils;
import lombok.extern.slf4j.Slf4j;

/**
 * @author: zxh
 * @date: 2024/8/21 16:55
 * @description: RPC框架应用，存放项目全局用到的变量。使用双检锁单例模式实现
 */
@Slf4j
public class RpcApplication {

	private static volatile RpcConfig rpcConfig;

	/**
	 * 初始化框架，支持传入自定义配置
	 * @author zxh
	 * @param newRpcConfig 自定义配置
	 * @CreateDate 2024/8/21
	 * @UpdateLog 2024/8/21 - []
	 */
	public static void init(RpcConfig newRpcConfig) {
		rpcConfig = newRpcConfig;
		log.info("rpc init, config = {}", newRpcConfig.toString());
		// 注册中心初始化
		RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
		Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
		registry.init(registryConfig);
		log.info("registry init, config = {}", registryConfig);

		// 创建并注册 ShutDown Hook，JVM退出时执行操作
		Runtime.getRuntime().addShutdownHook(new Thread(registry::destroy));
	}

	/**
	 * 初始化
	 * @author zxh
	 * @CreateDate 2024/8/21
	 * @UpdateLog 2024/8/21 - []
	 */
	public static void init() {
		RpcConfig newRpcConfig;
		try {
			newRpcConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
		} catch (Exception e) {
			// 配置加载失败，使用默认配置
			newRpcConfig = new RpcConfig();
		}
		init(newRpcConfig);
	}

	/**
	 * 获取配置
	 * @author zxh
	 * @return 返回配置对象
	 * @CreateDate 2024/8/21
	 * @UpdateLog 2024/8/21 - []
	 */
	public static RpcConfig getRpcConfig() {
		if (rpcConfig == null) {
			synchronized (RpcApplication.class) {
				if (rpcConfig == null) {
					init();
				}
			}
		}
		return rpcConfig;
	}
}
